﻿using System;
using System.Collections;
using System.Collections.Generic;
using Sistema.Dominio;
using Sistema.NFe;
using Sistema.WF.Componentes.FormulariosBase;
using Sistema.WF.View.Kernel;
using System.IO;
using Sistema.Util;
using System.Windows.Forms;
using Sistema.WF.View.NFE;

namespace Sistema.WF.View.NFe
{
    public partial class FRM_EnviaNota : FRM_pai
    {
        IList<NFeInfo> _notasListadas;
        IList<String> _caminhoArquivos;

        public FRM_EnviaNota()
        {
            InitializeComponent();
           
        }

        private void enviarNota(IList<NFeInfo> listaNFe)
        {   FRM_progresso progresso;

            try
            {
                                
                IList<NFeInfo> lista = new List<NFeInfo>();
                IList<String> caminho = new List<String>();

                EnviarNFe enviar = new EnviarNFe();

                this.HabilitarBotaoEnviar(false);
                lista = listaNFe;
                caminho = RecolherCaminhoArquivo();

                progresso = new FRM_progresso(lista.Count);

                Action<object, NFeEnvioArgs> acaoAoEnviar = new Action<object, NFeEnvioArgs>((asd, dados) =>
                {
                    progresso.Descricao = "Nota " + dados.Numero;
                    progresso.Avancar();

                });


                var certificado = new Util.CertificadoDigital().PesquisarCertificadoDigital();
                enviar.OnNFeEnvia += new NFeEventhandle(acaoAoEnviar);
                progresso.Show();
                this.Enabled = false;
                enviar.Enviar(lista, certificado);
                this.MoverArquivo(caminho, Properties.Resources.CaminhoXmlBackup);
                this.CarregaDadosNotas();
                this.Enabled = true;
                progresso.Fechar();
                this.HabilitarBotaoEnviar(true);

                Util.CaixaMensagem.CaixaDeMensagem("Notas enviadas com sucesso!");
            }
            catch (ViewException vx)
            {
                throw new ViewException("Erro ao enviar Nota Fiscal ", "Erro ao enviar Notas. Verifique sua conexão de internet.", vx);
            }
            
        }
        
        private void CMD_enviar_Click(object sender, EventArgs e)
        {
            IList<NFeInfo> retorno = GridHelper.RecolherDoGrid<NFeInfo>(GRD_Notas, true, _notasListadas);
            this.enviarNota(retorno);
            /*retorno = this.RecolherDoGrid();

            if (retorno.Count > 0)
            {
                
            }
            else
            {
                Util.CaixaMensagem.CaixaDeMensagem("Por favor, selecione uma nota para ser enviada.");
            }*/
                            
        }

        private void HabilitarBotaoEnviar(bool habilita)
        {
            this.CMD_enviar.Enabled = habilita;
        }

        private void MoverArquivo(IList<String> dados, String DiretorioDestino)
        {
           Sistema.Util.Arquivo arquivo = new Arquivo();
           
              arquivo.verificaSePastaExiste(DiretorioDestino);

            for (int i = 0; i < dados.Count; i++)
            { 
                String arquivoDestino = DiretorioDestino+"\\" + arquivo.NomeArquivo(dados[i]);
                arquivo.MoverArquivo(dados[i], arquivoDestino);
            }
       }

        private void CMD_sair_Click(object sender, EventArgs e)
        {
            this.Fechar();
        }

        private void Fechar()
        {
            this.Close();
            this.Dispose();
        }

        private IList<String> RecolherCaminhoArquivo()
        {
           
            IList<String> caminho = new List<String>();

            for (int i = 0; i < GRD_Notas.Rows.Count; i++)
            {
                if (((bool)GRD_Notas.Rows[i].Cells[0].Value))
                {
                    
                    caminho.Add(this._caminhoArquivos[i]);
                }
            }

            return caminho;
        }
        private IList<NFeInfo> RecolherDoGrid()
        {
            IList<NFeInfo> nfe = new List<NFeInfo>();
           
            for (int i = 0; i < GRD_Notas.Rows.Count; i++)
            {
                if (((bool)GRD_Notas.Rows[i].Cells[0].Value))
                {
                    nfe.Add(_notasListadas[i]);
                }
            }

                 
               return nfe;
            
        }

        private void CarregaGridNotas(IList<NFeInfo> dados)
        {
            Object[] _listadas = new Object[5];

            GridHelper.AtualizarGrid(GRD_Notas);

            for (int i = 0; i < dados.Count; i++)
            {
                _listadas[0] = false;
                _listadas[1] = dados[i].Numero.ToString();
                _listadas[2] = dados[i].Serie.ToString();
                _listadas[3] = dados[i].Dados.NaturezaOperacao.ToString();
                _listadas[4] = dados[i].Dados.DestinatarioRazaoSocial.ToString();
                GRD_Notas.Rows.Add(_listadas);
            }
        }

        private void FRM_EnviaNota_Load(object sender, EventArgs e)
        {
            CarregaDadosNotas();
             this.CheckClick();
        }
       
        private void CarregaDadosNotas()
        {
            try
            {
                Sistema.NFe.NFe pesquisaNotas = new Sistema.NFe.NFe();
                IList<NFeInfo> dados = new List<NFeInfo>();
                string caminho = Properties.Resources.CaminhoXmlEnviar;

                Arquivo leitorArquivo = new Arquivo();
                IList<String> arquivos = leitorArquivo.ListarArquivo(caminho);//, "*.xml"
                foreach (String xml in leitorArquivo.LerArquivo(arquivos))
                {
                    dados.Add(pesquisaNotas.LerDadosNFe(xml));
                }
                this._notasListadas = dados;
                this._caminhoArquivos = arquivos;
                CarregaGridNotas(dados);
            }
            catch (Exception)
            {
                Util.CaixaMensagem.CaixaDeMensagem("Não há Notas a serem enviadas.","Enviar Nota");
            }
            this.Fechar();
        }

        private void CMD_visualizar_Click(object sender, EventArgs e)
        {
            IList<NFeInfo> lista = GridHelper.RecolherDoGrid<NFeInfo>(GRD_Notas,true,_notasListadas);
            FRM_visualizarNota visualizar = new FRM_visualizarNota(lista[0].Dados.Xml);
            visualizar.ShowDialog();

        }
        private void CheckClick()
        {
            for (int i = 0; i < GRD_Notas.Rows.Count; i++)
            {
                if (((bool)GRD_Notas.Rows[i].Cells[0].Value))
                {

                    this.HabilitarBotaoEnviar(true);
                }
                else
                {
                    this.HabilitarBotaoEnviar(false);
                }

            }
        }

        private void GRD_Notas_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            for (int i = 0; i < GRD_Notas.Rows.Count; i++)
            {
                if (((bool)GRD_Notas.Rows[i].Cells[0].Value))
                {

                    this.HabilitarBotaoEnviar(true);
                }

            }
        }
    }

}
